什么是 MySQL?MySQL 是一個(gè)開(kāi)源的 RDBMS(關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))。它基于結(jié)構(gòu)化查詢語(yǔ)言 (SQL),可在許多平臺(tái)上運(yùn)行,包括 Windows、Linux 和 UNIX。MySQL 還在所有流行的公共云平臺(tái)上作為服務(wù)提供,包括Amazon、Azure和Google Cloud。
MySQL 是 LAMP 的一部分,LAMP 是一個(gè)開(kāi)源 Web 開(kāi)發(fā)平臺(tái)。LAMP 企業(yè)堆棧由 Linux(操作系統(tǒng))、Apache(Web 服務(wù)器)、MySQL (RDBMS) 和 PHP(面向?qū)ο蟮哪_本語(yǔ)言)、Perl 或 Python 組成。
MySQL 有助于支持各種用例,包括 Web 應(yīng)用程序和在線發(fā)布場(chǎng)景。它為網(wǎng)站、面向消費(fèi)者和基于企業(yè)網(wǎng)絡(luò)的應(yīng)用程序提供支持,例如 Twitter、YouTube 和 Facebook。
數(shù)據(jù)庫(kù)安全威脅
數(shù)據(jù)庫(kù)存儲(chǔ)敏感信息,這些信息容易受到許多威脅——包括數(shù)據(jù)丟失和被盜、隱私侵犯、可用性問(wèn)題以及惡意或意外修改。這些問(wèn)題可能由于各種原因而發(fā)生,包括外部攻擊者、惡意內(nèi)部人員和意外操作。MySQL 等開(kāi)源數(shù)據(jù)庫(kù)通常會(huì)帶來(lái)與安全通信和訪問(wèn)控制相關(guān)的安全問(wèn)題,以及已知漏洞和零日漏洞等開(kāi)源安全風(fēng)險(xiǎn)。
訪問(wèn)和特權(quán)
例如,過(guò)多的權(quán)限可以讓用戶獲得對(duì)機(jī)密信息的不必要的訪問(wèn)權(quán)限。此問(wèn)題可能會(huì)升級(jí)為權(quán)限濫用,使授權(quán)用戶能夠?yàn)E用其權(quán)限來(lái)執(zhí)行未經(jīng)授權(quán)的操作。雖然您可以使用訪問(wèn)控制策略和查詢級(jí)訪問(wèn)控制來(lái)緩解這些威脅,但可能會(huì)出現(xiàn)更多問(wèn)題。例如,它可能無(wú)法阻止威脅參與者將低級(jí)別訪問(wèn)升級(jí)為高級(jí)權(quán)限。
漏洞和攻擊
平臺(tái)和操作系統(tǒng)通常包含漏洞,可能導(dǎo)致泄漏和數(shù)據(jù)損壞。您可以使用補(bǔ)丁管理流程和漏洞評(píng)估來(lái)緩解這種情況。但是,漏洞評(píng)估無(wú)法阻止威脅行為者使用 SQL 注入發(fā)送未經(jīng)授權(quán)的數(shù)據(jù)庫(kù)查詢以誘騙服務(wù)器泄露信息。您需要使用準(zhǔn)備好的 SQL 語(yǔ)句來(lái)減輕這種威脅。數(shù)據(jù)庫(kù)也會(huì)受到拒絕服務(wù) (DoS) 攻擊,這些攻擊會(huì)使資源和數(shù)據(jù)庫(kù)不可用,從而拒絕用戶訪問(wèn)數(shù)據(jù)或應(yīng)用程序。
MySQL 安全最佳實(shí)踐
以下最佳實(shí)踐可以幫助您增強(qiáng) MySQL 數(shù)據(jù)庫(kù)的安全性。
修改端口映射
MySQL 的默認(rèn)映射是在端口 3306 上運(yùn)行。您應(yīng)該在安裝 MYSQL 后更改此設(shè)置以隱藏運(yùn)行關(guān)鍵服務(wù)的端口。攻擊者通常首先針對(duì)默認(rèn)設(shè)置,因此修改它們以避免漏洞利用非常重要。
避免使用 root 權(quán)限運(yùn)行 MySQL
您應(yīng)該在包含運(yùn)行服務(wù)所需的最小權(quán)限的專用用戶帳戶下運(yùn)行 MySQL。不要讓 MySQL 直接作為根服務(wù)器運(yùn)行。除了日志記錄和審計(jì)的優(yōu)勢(shì)之外,避免 root 級(jí)權(quán)限有助于確保攻擊者無(wú)法劫持 root 用戶帳戶以獲得訪問(wèn)權(quán)限。
在云中保護(hù) MySQL
如果您在云環(huán)境中運(yùn)行 MySQL,您的云提供商可能會(huì)提供安全服務(wù)來(lái)保護(hù)您的數(shù)據(jù)庫(kù)。例如,Azure 允許您使用 Microsoft Defender 來(lái)保護(hù)您的開(kāi)源關(guān)系數(shù)據(jù)庫(kù),以檢測(cè)可能表明惡意嘗試訪問(wèn)服務(wù)器的異常行為。AWS 提供 AWS Shield 來(lái)幫助保護(hù)應(yīng)用程序和數(shù)據(jù)庫(kù)免受分布式拒絕服務(wù) (DDoS) 攻擊。
禁用和刪除您的 MySQL 歷史記錄
默認(rèn)情況下,MySQL 在安裝時(shí)會(huì)創(chuàng)建一個(gè)歷史文件,將其存儲(chǔ)在 ~/.mysql_history 下。您應(yīng)該刪除此文件,因?yàn)樗敿?xì)說(shuō)明了您的安裝和配置歷史。如果受到破壞,惡意行為者可以使用它來(lái)暴露關(guān)鍵的數(shù)據(jù)庫(kù)用戶密碼。您還應(yīng)該創(chuàng)建從歷史文件到空設(shè)備的軟鏈接,以防止 MySQL 將事件記錄到文件中。
鎖定可疑活動(dòng)的用戶帳戶
MySQL 8.0.19 引入了臨時(shí)帳戶鎖定功能。您可以將 MySQL 設(shè)置為根據(jù)登錄嘗試失敗次數(shù)和帳戶鎖定時(shí)間等變量來(lái)鎖定用戶帳戶。
在創(chuàng)建用戶帳戶時(shí)運(yùn)行以下腳本以啟用帳戶鎖定:CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘userpassword’ FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 10;
失敗登錄嘗試變量后面的值指定鎖定帳戶之前所需的失敗嘗試次數(shù)。密碼鎖定時(shí)間變量后面的值指定帳戶將被鎖定的時(shí)間(以天為單位)。您還可以將“無(wú)界”指定為密碼鎖定時(shí)間值,以使帳戶無(wú)限期鎖定,直到手動(dòng)解鎖為止。
使用身份驗(yàn)證插件
身份驗(yàn)證插件使用戶能夠選擇他們喜歡的身份驗(yàn)證方法。MySQL 支持許多可插入的身份驗(yàn)證選項(xiàng),您可以將它們組合起來(lái)以獲得更高的安全性。您可以在 ALTER USER 或 CREATE USER 等語(yǔ)句旁邊使用身份驗(yàn)證插件。
例如:CREATE USER ‘user_7’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
此查詢使用本機(jī)密碼散列來(lái)實(shí)現(xiàn)身份驗(yàn)證。
限制或禁用數(shù)據(jù)庫(kù)可見(jiàn)性
SHOW DATABASES 命令允許用戶查看敏感信息。您應(yīng)該限制使用此命令以防止遠(yuǎn)程用戶和惡意行為者收集有關(guān)您的數(shù)據(jù)庫(kù)的數(shù)據(jù)。您可以通過(guò)在 [mysqld] 部分中指定“skip-show-database”來(lái)限制或刪除 MYSQL 配置文件中的此功能。
加密靜態(tài)和傳輸中的數(shù)據(jù)
默認(rèn)情況下,MySQL 在服務(wù)器和客戶端之間使用未加密的通信,這為攻擊者提供了通過(guò)中間人 (MitM) 攻擊攔截?cái)?shù)據(jù)的機(jī)會(huì)。同樣,數(shù)據(jù)庫(kù)中未加密的任何用戶數(shù)據(jù)都可能危及用戶的完整性和隱私。
您可以使用 TLS/SSL 加密來(lái)保護(hù)網(wǎng)絡(luò)之間的 MySQL 通信。受保護(hù)網(wǎng)絡(luò)內(nèi)的通信可能不需要加密。MySQL 還允許您對(duì)靜態(tài)數(shù)據(jù)進(jìn)行加密,以在服務(wù)器遭到破壞時(shí)保護(hù)您存儲(chǔ)的數(shù)據(jù)。
實(shí)施安全密碼策略
MySQL 允許您應(yīng)用密碼策略,要求非特權(quán)用戶在輸入當(dāng)前密碼時(shí)設(shè)置新密碼。此功能可以保護(hù)您的數(shù)據(jù)庫(kù)免受多種威脅,例如入侵主機(jī)并嘗試使用 Web Shell 訪問(wèn)用戶數(shù)據(jù)庫(kù)會(huì)話的攻擊者。啟用密碼策略更改后,攻擊者無(wú)法鎖定目標(biāo)用戶,除非他們擁有用戶的現(xiàn)有密碼。
MySQL 默認(rèn)不啟用 Change Current Password 策略。您可以基于單個(gè)用戶或全局控制此策略(在所有非特權(quán)用戶帳戶中強(qiáng)制執(zhí)行)。建議全局設(shè)置策略,或至少覆蓋所有非特權(quán)用戶。使用 my.cnf 服務(wù)器文件啟用全局當(dāng)前密碼策略。